package br.com.processo.modelo;

import java.io.Serializable;
import java.util.List;

import javax.persistence.AttributeOverride;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "USUARIO")
@AttributeOverride(name = "id", column = @Column(name = "ID_USUARIO"))
public class Usuario extends Identificavel implements Serializable {

	private static final long serialVersionUID = -2795924068852768387L;

	@Size(max = 150)
	@Column(name = "NOME")
	@NotNull(message = "o nome nao pode ser null")
	private String nome;

	@Size(max = 50)
	@Column(name = "LOGIN")
	@NotNull(message = "o login nao pode ser null")
	private String login;

	@Size(max = 150)
	@Column(name = "SENHA")
	@NotNull(message = "a senha nao pode ser null")
	private String senha; // senha sem criptografia

	@Column(name = "ADMINISTRADOR")
	private boolean administrador;

	@NotNull(message = "Todo usuario deve se encontrar em algum setor!")
	@ManyToOne(targetEntity = Setor.class)
	@JoinColumn(name = "ID_SETOR")
	private Setor setor;
	
	@NotNull(message = "Todo usuario deve se encontrar em algum estado!")
	@ManyToOne(targetEntity = Estado.class)
	@JoinColumn(name = "ID_ESTADO")
	private Estado estado;
	
	@NotNull(message = "Todo usuario deve se encontrar em alguma cidade!")
	@ManyToOne(targetEntity = Cidade.class)
	@JoinColumn(name = "ID_CIDADE")
	private Cidade cidade;

	@OneToMany(mappedBy = "usuario", cascade = CascadeType.ALL)
	private List<Processo> processos;
	
	@OneToMany(mappedBy = "autor", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	private List<Parecer> pareceres;

	public Usuario() {
	}

	public Usuario(String login, String senha) {
		this.setLogin(login);
		this.setSenha(senha);
	}

	public Usuario(String nome, String login, String senha) {
		this.setNome(nome);
		this.setLogin(login);
		this.setSenha(senha);
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public Setor getSetor() {
		return setor;
	}

	public void setSetor(Setor setor) {
		this.setor = setor;
	}

	public boolean getAdministrador() {
		return administrador;
	}

	public void setAdministrador(boolean administrador) {
		this.administrador = administrador;
	}

	public List<Parecer> getPareceres() {
		return pareceres;
	}

	public void setPareceres(List<Parecer> pareceres) {
		this.pareceres = pareceres;
	}

	public Estado getEstado() {
		return estado;
	}

	public void setEstado(Estado estado) {
		this.estado = estado;
	}

	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

}
